/** 
 * Creator类是脚手架的核心，实现处理用户输入，初始化安装环境，生成项目文件，生成readme文件，初始化git等功能。
 * lib/create.js文件引入Creator类进行实例化，并调用。
*/

const inquirer = require('inquirer');
const { defaults } = require('./util/preset');
const PromptModuleAPI = require('./PromptModuleAPI')
const { getPromptModules } = require('./util/prompt')

class Creator {
  constructor(name, context) {
    // 项目名称
    this.name = name;
    // 项目路径，含名称
    this.context = process.env.VUE_CLI_CONTEXT = context;
    // package.json 数据
    this.pkg = {};
    // 包管理工具
    this.pm = null;
    // 预设提示选项
    this.presetPrompt = this.resolvePresetPrompts();
    // ...测试代码
    inquirer.prompt(this.resolveFinalPrompts()).then(res => {
      console.log('选择的选项');
      console.log(res);
    })

    const promptAPI = new PromptModuleAPI(this);
    const promptModules = getPromptModules();
    promptModules.forEach(m => m(promptAPI))
    // 测试代码...

    // 自定义特性提示选项（复选框）
    this.featurePrompt = this.resolveFeaturePrompts();
  }
  async create(cliOptions = {}, preset = null) {
    // // 处理用户输入
    // const preset = await this.promptAndResolvePreset();

    // // 初始化安装环境
    // await this.initPackageManagerEnv(preset);

    // // 生成readme文件
    // await this.generateReadme(gennerator);

    // this.finishen();
  }

  // 获取预设的选项
  resolvePresetPrompts() {
    // 从 preset 中拿到预设的提示放到 choices 中
    const presetChoices = Object.entries(defaults.presets).map(([name, preset]) => {
      return {
        name: `${name}(${Object.keys(preset.plugins).join(',')})`, // 将预设的插件放到提示
        value: name
      }
    })
    return {
      name: 'preset', // preset 记录用户选择的选项值
      type: 'list', // list 表单选择
      message: `please pick a preset`,
      choices: [
        ...presetChoices, // Vue2 默认配置，Vue3默认配置
        {
          name: 'Manually select features', // 手动选择配置，自定义特性配置
          value: '__manual__'
        }
      ]
    }
  }
  // 自定义特性复选框
  resolveFeaturePrompts() {
    return {
      name: 'features', // features 记录用户选择的选项值
      when: answers => answers.preset === '__manual__', // 当选择"Manually select features"时，该提示显示
      type: 'checkbox',
      message: 'Check the features needed for your project:',
      choices: [], // 复选框组
      pageSize: 10
    }
  }
  // 测试代码
  resolveFinalPrompts() {
    const prompts = [
      this.presetPrompt,
      this.featurePrompt
    ]
    return prompts
  }
}

module.exports = Creator;